import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.TreeSet;
import java.util.stream.Collectors;



public class Demo6719 {

	public static void main(String[] args) {

//		 使用自然排序
		List<Course6719> courses = getCourses();
		for (Course6719 c : courses) {
			System.out.println(c);
		}
		
		
//		 按compareTo方法进行自然排序
		System.out.println("==========按成绩降序==========");
		TreeSet<Course6719> courseSet1 = new TreeSet<>();
		addSet(courseSet1);
		courseSet1.forEach(System.out::println);
//		 按编号排序
		sorterByNo6719();
//		 按学期升序
//		streamByTerm6719();
		  
	}

	private static List<Course6719> getCourses()  {
		// 使用数组保存一组对象
		 List<Course6719> courses=new ArrayList<Course6719>();
		 courses.add(new Course6719("A001", "C程序设计基础", "1上", 4, 80));
		 courses.add(new Course6719("B002", "Pthon程序基础", "1下", 2, 85));
		 courses.add(new Course6719("A002", "面向对象程序设计", "2上", 3, 78));
		 courses.add( new Course6719("C001", "Java程序高级开发", "3上", 2, 83));
		 courses.add(new Course6719("C002", "软件工程与UML", "3下", 3, 75));
		 courses.add( new Course6719("B001", "操作系统", "2下", 3, 90));
		 courses.add( new Course6719("A003", "数据库原理", "2上", 3, 78));
		 courses.add( new Course6719("B003", "网络基础", "3上", 3, 75));
		 courses.add(new Course6719("0001", "大学英语", "1上", 3, 80));
		 courses.add( new Course6719("0002", "高等数学", "1下", 2, 85));
		return courses;
	}
	private static void addSet(TreeSet<Course6719> courseSet) {
		courseSet.add(new Course6719("0001", "大学英语\t\t", "1上", 3, 80));
		courseSet.add(new Course6719("0002", "高等数学\t\t", "1下", 2, 85));
		courseSet.add(new Course6719("A001", "C程序设计基础\t\t", "1上", 4, 80));
		courseSet.add(new Course6719("A002", "面向对象程序设计\t", "2上", 3, 78));
		courseSet.add(new Course6719("A003", "数据库原理\t\t", "2上", 3, 78));
		courseSet.add(new Course6719("B001", "操作系统\t\t", "2下", 3, 90));
		courseSet.add(new Course6719("B002", "Python程序基础\t", "1下", 2, 85));
		courseSet.add(new Course6719("B003", "网络基础\t\t", "3上", 3, 75));
		courseSet.add(new Course6719("C001", "Java程序高级开发\t", "3上", 2, 83));
		courseSet.add(new Course6719("C002", "软件工程与UML\t\t", "3下", 3, 75));
	
	}
		
	private static void sorterByNo6719() {
		System.out.println("==========按课程编号升序==========");
		// 课程号唯一所以只需调用Integer的compareTo
		// Lambda表达式只有一行可以省略{}与return
		TreeSet<Course6719> courseSet4 = new TreeSet<>((c1, c2) -> c1.getNo().compareTo(c2.getNo()));
		//添加数据
		addSet(courseSet4);
		//方法引用输出集合中的元素
		courseSet4.forEach(System.out::println);
	}

	private static void streamByTerm6719() {
		System.out.println("==========按学期升序 ==========");
		// 如果开课学期相等调用Course可以直接调用compareTo方法进行进行成绩降序、学分升序、课程号降序排序
		getCourses().stream().
		sorted((c1,c2)->c1.getTerm().compareToIgnoreCase(c2.getTerm())).
			forEach(System.out::println);
		
		//(1)所有课程的平均值
		System.out.print("(1)所有课程的平均值:");
		System.out.println(getCourses().stream()
				.mapToInt(Course6719::getScore).average().getAsDouble());
		
		//（2）找出最高分的课程
		
		System.out.println("(2)最高分的课程:");
		Optional<Course6719>max =getCourses().stream()
				.collect(Collectors.maxBy((c1,c2)->c1.getScore()-c2.getScore()));
		System.out.println(max.get());
		//（3）找出最低分的课程
		System.out.println("(3)最低分的课程：");
		System.out.println(getCourses().stream()
				.min(Comparator.comparingInt(Course6719::getScore)).get());
		
		//（4）列出85分以上的课程名单，统计并输出课程数
		
				System.out.println("=====85分以上的课程名单=====");
				System.out.println("共"+getCourses().stream()
						.filter(x->x.getScore()>=85).count()+"门:");
				getCourses().stream().filter(x->x.getScore()>=85).forEach(System.out::println);
				
				
				
		
	}
	
}
